package com.vista.beans.documento;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.model.LazyDataModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.facade.documento.IGestionDocumento;
import com.facade.tipos.IGestionTipo;
import com.modelo.entity.Documento;
import com.modelo.entity.Tipo;
import com.vista.utils.UtilsWeb;

@Component
@Scope("request")
public class DocumentoBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String buttonText = "Crear";
	private Integer caducidad;
	private String descripcion;
	// ////////////////////////////////// docModificar.xhtml
	private Documento docModificar;
	private Documento[] docSeleccionados;
	private boolean esComunObras;
	private boolean esTipoMany = true;

	// Customizacion de la vista.
	private String header = "Nuevo Documento";
	private Integer id = null;
	@Autowired
	private IGestionDocumento iGestionDocumento;

	@Autowired
	private IGestionTipo iGestionTipo;
	// ////////////////////////////////// docEliminar.xhtml
	@Autowired
	@Qualifier("LazyDocumentoDataModel")
	private LazyDataModel<Integer> lazyDocumentos;

	private Map<String, Integer> listaTipos;

	// nos devuelve tipo String
	private List<String> listaTiposSelected;

	private String nombre;

	public void crear(ActionEvent event) {
		// Message to show
		String messageHeader = "Documento Creado Correctamente";
		String messageBody = "Creado Correctamente";
		Severity kindMessage = FacesMessage.SEVERITY_INFO;
		String idMessages = "informacion";

		try {
			Documento documento = new Documento();
			documento.setCaducidad(caducidad);
			documento.setDescripcion(descripcion);
			documento.setEsComunObras(UtilsWeb.getInteger(esComunObras));
			documento.setFechaAlta(new Date());
			documento.setNombre(nombre);

			// from view came with id=0
			if (id != null && !id.equals(new Integer(0))) {
				// Update
				documento.setId(id);
				if (listaTiposSelected.size() < 2 && !listaTiposSelected.isEmpty()) {
					Tipo tipo = new Tipo();
					tipo.setIdTipos(Integer.valueOf(listaTiposSelected.get(0)));
					documento.setTipos(tipo);
					iGestionDocumento.actualizar(documento);
					messageHeader = "Documento Modificado Correctamente";
					messageBody = "Modificado Correctamente";
					resetValues();
				} else {
					messageHeader = "Documento Modificado Error";
					messageBody = "Debe seleccionar un solo tipo de documento";
					kindMessage = FacesMessage.SEVERITY_ERROR;
				}

				esTipoMany = false;
				buttonText = "Modificar";
				header = "Modificar Documento";
			} else {
				// Create
				for (String idTipo : listaTiposSelected) {
					Tipo tipo = new Tipo();
					tipo.setIdTipos(Integer.valueOf(idTipo));
					documento.setTipos(tipo);
					iGestionDocumento.crear(documento);
				}
				resetValues();
			}
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: mirar la excepcion que es y mandar por email.
			kindMessage = FacesMessage.SEVERITY_ERROR;
			messageHeader = "Error Creacion Documento";
			messageBody = "Documento NO Creado";
		}

		FacesContext.getCurrentInstance().addMessage(idMessages,
				new FacesMessage(kindMessage, messageHeader, messageBody));

	}

	public void eliminarDocumentos() {
		try {
			if (docSeleccionados != null && docSeleccionados.length > 0) {
				List<Documento> docsEliminar = Arrays.asList(docSeleccionados);
				iGestionDocumento.delete(docsEliminar);

				FacesContext.getCurrentInstance()
						.addMessage(
								"informacion",
								new FacesMessage(FacesMessage.SEVERITY_INFO,
										"Documentos Eliminados: ", "En total se han eliminado "
												+ docsEliminar.size() + " documentos"));
			}
		} catch (Exception e) {
			// TODO: handle exception Enviar email diciendo el error.
			FacesContext
					.getCurrentInstance()
					.addMessage(
							"informacion",
							new FacesMessage(FacesMessage.SEVERITY_ERROR,
									"Documentos Eliminados: ",
									"Se produjo un error al eliminar los documentos con los siguientes IDs -> "));
			e.printStackTrace(); // TODO Borrar pasado un tiempo
			// TODO falta poner los ids q se eliminan.
		}
	}

	public String getButtonText() {
		return buttonText;
	}

	public Integer getCaducidad() {
		return caducidad;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public Documento getDocModificar() {
		return docModificar;
	}

	public Documento[] getDocSeleccionados() {
		return docSeleccionados;
	}

	public String getHeader() {
		return header;
	}

	public Integer getId() {
		return id;
	}

	public LazyDataModel<Integer> getLazyDocumentos() {
		return lazyDocumentos;
	}

	public Map<String, Integer> getListaTipos() {
		return iGestionTipo.getTiposForVista();
	}

	public List<String> getListaTiposSelected() {
		return listaTiposSelected;
	}

	public String getNombre() {
		return nombre;
	}

	public boolean isEsComunObras() {
		return esComunObras;
	}

	public boolean isEsTipoMany() {
		return esTipoMany;
	}

	public String modificar() {
		System.out.println("tam c- " + docModificar.getDescripcion());

		nombre = docModificar.getNombre();
		descripcion = docModificar.getDescripcion();
		caducidad = docModificar.getCaducidad();
		esComunObras = UtilsWeb.getBoolean(docModificar.getEsComunObras());
		id = docModificar.getId();

		listaTipos = new HashMap<String, Integer>();
		listaTiposSelected = new ArrayList<String>();
		listaTiposSelected.add(docModificar.getTipos().getIdTipos().toString());
		// Customizacion de la vista
		esTipoMany = false;
		buttonText = "Modificar";
		header = "Modificar Documento";

		return "docNuevo";
	}

	private void resetValues() {
		id = null;
		nombre = "";
		descripcion = "";
		caducidad = null;
		esComunObras = false;

		// nos devuelve tipo String
		listaTiposSelected = new ArrayList<String>();

		// Customizacion de la vista.
		header = "Nuevo Documento";
		esTipoMany = true;
		buttonText = "Crear";

	}

	public void setButtonText(String buttonText) {
		this.buttonText = buttonText;
	}

	public void setCaducidad(Integer caducidad) {
		this.caducidad = caducidad;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public void setDocModificar(Documento docModificar) {
		this.docModificar = docModificar;
	}

	public void setDocSeleccionados(Documento[] docSeleccionados) {
		this.docSeleccionados = docSeleccionados;
	}

	public void setEsComunObras(boolean esComunObras) {
		this.esComunObras = esComunObras;
	}

	public void setEsTipoMany(boolean esTipoMany) {
		this.esTipoMany = esTipoMany;
	}

	public void setHeader(String header) {
		this.header = header;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public void setiGestionDocumento(IGestionDocumento iGestionDocumento) {
		this.iGestionDocumento = iGestionDocumento;
	}

	public void setiGestionTipo(IGestionTipo iGestionTipo) {
		this.iGestionTipo = iGestionTipo;
	}

	public void setLazyDocumentos(LazyDataModel<Integer> lazyDocumentos) {
		this.lazyDocumentos = lazyDocumentos;
	}

	public void setListaTiposSelected(List<String> listaTiposSelected) {
		this.listaTiposSelected = listaTiposSelected;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
}
